#pragma once

#include "../Headers/authr.h"
#include "../Headers/log.h"

#include "../NS/nameserver.h"

#include "ws.rpc.h"
#include "ws.functions.h"
#include "ws.client.h"
#include "ws.request.h"

#include <string>
#include <cstring>
#include <vector>

namespace TOB {
  namespace WS {
    class PackerException {
    public:
      /**
       * Обработчик исключительной ситуации, выводит сообщение об ошибке
       * @param scheme схема протокола, который не поддерживается
       */
      PackerException(std::string scheme);
    };
    
    class Packer {
    private:
      int _count;
      std::vector<package> _packs;
    public:
      /**
       * Упаковка параметров запроса, для отправки на сервер
       * 
       * @param request название функции которая будет выполнена на сервере
       * @param userName имя пользователя
       * @param password пароль
       * @param data данные файла, в случае, если нужно загрузить файл на сервер
       * @return упакованные данные, которые можно разбивать на пакеты и отправлять
       */
      Packer(std::string request, TOB::WS::Data* data, TOB::Nameserver::IP nsip = 0, std::string username = "", std::string password = "");
      /**
       * Создание пустого объекта
       */
      Packer();
      /**
       * Удаление объекта и отчистка памяти
       */
      ~Packer();
      /**
       * Получить количество пакетов в данном объекте
       * @return количество пакетов
       */
      int getCount();
      /**
       * Получить пакет по инедксу
       * @param index индекс пакета который нужно получить
       * @return пакет
       */
      package& operator [](int index);
      /**
       * Добавить пакет в объект
       * @param pack пакет, который нужно добавить к объекту
       */
      void push(package& pack);
      /**
       * Удалить запись
       * @param index индекс удаляемой записи
       */
      void erase(int index);
    };
  }
}
